AWS CLIを使ってCloudWatchメトリクスから統計レポートを作成する
西澤です。CloudWatchを利用していると、AWS Management Consoleからのグラフだけでは物足りなくなることがありますよね。非常に便利で見やすいのですが、詳細データを数字で細かく追ったり、サマリでレポートを作ったりもしたくなります。
画面上からエクスポート機能は無いのでしょうか?みたいなお問い合わせもよくいただくのですが、そのような機能は実装されていないようです。ただ、CloudWatchも他のサービスと同様API(今回はAWS CLIを使います)から情報が取得できるという特性を利用すると、統計レポートのような出力も簡単に生成することができます。ぱっとイメージしてしまうような5分おきのデータを出力して、Excelでまとめてゴニョゴニョする必要はありません。
AWS CLIで統計レポートを作成する
ということで、たまたま今回問い合わせが合ったケース等を含めて、利用例を紹介してみようと思います。変数での計算はbash前提ですが、何を意味する数字かわかるようにあえて計算式で残しています。
サンプル1:NetworkInの10月の合計
get-metric-statistics
オプションを使って情報を取得するわけですが、StartTimeからEndTimeまでの時間の長さとperiodに指定している時間の長さを等しくすれば、1つだけDatapointが返されます。Statistics=Sumであれば、その期間のすべての合計値を取得することができます。
$ INSTANCE_ID=i-12345xxxxx12345xx $ METRIC_NAME=NetworkIn $ STATISTICS=Sum $ aws cloudwatch get-metric-statistics \ --namespace "AWS/EC2" \ --dimensions Name=InstanceId,Value=${INSTANCE_ID} \ --metric-name ${METRIC_NAME} \ --statistics ${STATISTICS} \ --start-time "2017-10-01T00:00:00Z" \ --end-time "2017-11-01T00:00:00Z" \ --period $((60 * 60 * 24 * 31)) { "Datapoints": [ { "Timestamp": "2017-10-01T00:00:00Z", "Sum": 3436909364721.0, "Unit": "Bytes" } ], "Label": "NetworkIn" }
サンプル2:NetworkOutの10月の日毎の合計
StartTimeからEndTimeまでの時間の長さよりもperiodを短くすると、その期間区切りのDatapointが返されるのですが、これがソートしないと全くバラバラに返されるのでかなり見づらくなります。そこで、JMESPathのsort_by
関数を利用して、ソートしています。あともう1点、今回取得したかった数値が極端に大きかったので、浮動小数点表記になってしまうのを防ぐためにto_string
関数を利用しました。
$ INSTANCE_ID=i-12345xxxxx12345xx $ METRIC_NAME=NetworkOut $ STATISTICS=Sum aws cloudwatch get-metric-statistics \ --namespace "AWS/EC2" \ --dimensions Name=InstanceId,Value=${INSTANCE_ID} \ --metric-name ${METRIC_NAME} \ --statistics ${STATISTICS} \ --start-time "2017-10-01T00:00:00Z" \ --end-time "2017-11-01T00:00:00Z" \ --period $((60 * 60 * 24)) \ --query "sort_by(Datapoints,&Timestamp)[][Timestamp,to_string(${STATISTICS}),Unit]" \ --output text 2017-10-01T00:00:00Z 71661218805.0 Bytes 2017-10-02T00:00:00Z 81392451598.0 Bytes 2017-10-03T00:00:00Z 79559537934.0 Bytes 2017-10-04T00:00:00Z 79782763094.0 Bytes 2017-10-05T00:00:00Z 76887847793.0 Bytes 2017-10-06T00:00:00Z 77208088683.0 Bytes 2017-10-07T00:00:00Z 75847304465.0 Bytes 2017-10-08T00:00:00Z 72538011928.0 Bytes 2017-10-09T00:00:00Z 76747782099.0 Bytes 2017-10-10T00:00:00Z 83328524664.0 Bytes 2017-10-11T00:00:00Z 78420008408.0 Bytes 2017-10-12T00:00:00Z 79247577251.0 Bytes 2017-10-13T00:00:00Z 78357859824.0 Bytes 2017-10-14T00:00:00Z 75623328705.0 Bytes 2017-10-15T00:00:00Z 74770158139.0 Bytes 2017-10-16T00:00:00Z 80115704811.0 Bytes 2017-10-17T00:00:00Z 79514662599.0 Bytes 2017-10-18T00:00:00Z 77719166215.0 Bytes 2017-10-19T00:00:00Z 83410245760.0 Bytes 2017-10-20T00:00:00Z 76441426020.0 Bytes 2017-10-21T00:00:00Z 71187237439.0 Bytes 2017-10-22T00:00:00Z 145237041966.0 Bytes 2017-10-23T00:00:00Z 143125551874.0 Bytes 2017-10-24T00:00:00Z 86199366262.0 Bytes 2017-10-25T00:00:00Z 81686620797.0 Bytes 2017-10-26T00:00:00Z 80803138108.0 Bytes 2017-10-27T00:00:00Z 73064998472.0 Bytes 2017-10-28T00:00:00Z 67106237341.0 Bytes 2017-10-29T00:00:00Z 72407548650.0 Bytes 2017-10-30T00:00:00Z 77275789860.0 Bytes 2017-10-31T00:00:00Z 80184831273.0 Bytes
サンプル3:CPUUtilizationの10/31の時間ごとの最大
あとはもう似たようなものですが、例えば今度は時間ごとのMax値なんかも簡単に取得することができます。慣れてさえしまえば、AWS Management Consoleで操作するより早く正確な情報が取れるのではないでしょうか?
$ INSTANCE_ID=i-12345xxxxx12345xx $ METRIC_NAME=CPUUtilization $ STATISTICS=Maximum $ aws cloudwatch get-metric-statistics \ --namespace "AWS/EC2" \ --dimensions Name=InstanceId,Value=${INSTANCE_ID} \ --metric-name ${METRIC_NAME} \ --statistics ${STATISTICS} \ --start-time "2017-10-31T00:00:00Z" \ --end-time "2017-11-01T00:00:00Z" \ --period $((60 * 60)) \ --query "sort_by(Datapoints,&Timestamp)[][Timestamp,${STATISTICS},Unit]" \ --output text 2017-10-31T00:00:00Z 11.33 Percent 2017-10-31T01:00:00Z 11.75 Percent 2017-10-31T02:00:00Z 15.5 Percent 2017-10-31T03:00:00Z 64.24 Percent 2017-10-31T04:00:00Z 12.97 Percent 2017-10-31T05:00:00Z 12.58 Percent 2017-10-31T06:00:00Z 12.25 Percent 2017-10-31T07:00:00Z 12.42 Percent 2017-10-31T08:00:00Z 12.25 Percent 2017-10-31T09:00:00Z 12.17 Percent 2017-10-31T10:00:00Z 11.58 Percent 2017-10-31T11:00:00Z 12.08 Percent 2017-10-31T12:00:00Z 11.86 Percent 2017-10-31T13:00:00Z 11.83 Percent 2017-10-31T14:00:00Z 11.58 Percent 2017-10-31T15:00:00Z 10.68 Percent 2017-10-31T16:00:00Z 10.42 Percent 2017-10-31T17:00:00Z 10.17 Percent 2017-10-31T18:00:00Z 9.33 Percent 2017-10-31T19:00:00Z 9.33 Percent 2017-10-31T20:00:00Z 9.51 Percent 2017-10-31T21:00:00Z 10.92 Percent 2017-10-31T22:00:00Z 11.08 Percent 2017-10-31T23:00:00Z 11.36 Percent
下記記事と重複するところがあるので、こちらも合わせてお読みいただけると嬉しいです。
念の為、昨年アップデートされたCloudWatchのデータ保存期間もおさらいしておきましょう。1時間おきのデータであれば、1年以上残っているので安心ですね。
まとめ
ちょうどお問合わせをいただいたので、ざっと書いてみました。ちょっとコツが必要ではありますが、中途半端なCSV出力機能よりも慣れればずっと簡単に集計レポートが作れるので、ぜひ試してみていただければと思います。
どこかの誰かのお役に立てば嬉しいです。